;
(function(S) {
	var _getMethodName = function(key) {
		return key.charAt(0).toUpperCase() + key.substr(1);
	}
    /**
     * 该类是一个抽象类，提供操作自定义属性的方法，一般并不直接实例化
     * 继承自EventTarget，在设置属性时会触发动态创建的事件
     * 设置属性成功会触发动态创建的change事件
     * @class Simple.Attribute
     * @extends Simple.EventTarget
     */
	S.declare('Attribute', S.EventTarget, {
		/**
		 * 获取某个key值，该值可以通过自定义的一个方法改变
		 * 例如如果key为Name，那么复写getName方法可以改变取到的值
		 * 	getName:function(value){
		 * 		return Math.min(value,0);
		 * }
		 * @method get
		 * @param {String} key
		 * @return {Object} 该key所对应的值
		 */
		get : function(key) {
			var getKeyMethod = 'getter' + _getMethodName(key);
			
			if ( typeof this[getKeyMethod] === 'function') {
				return this[getKeyMethod](this[key]);
			}
			return this[key];
		},
		/**
		 * 设置某个key的值，该值在改变前首先触发beforekeychange自定义事件
		 * 其次该值可以通过定义的一个方法改变值
		 * 最后如果设置成功，会触发keychange 事件
		 * @method set
		 * @param {Object} key
		 * @param {Object} value
		 */
		set : function(key, value) {
			var lastValue = this[key], setKeyMethod = 'setter' + _getMethodName(key);
			if (lastValue === value) {
				return false;
			}
			if(this.trigger('before'+_getMethodName(key)+'Change',{value:value}) === false) {
				return false;
			}
			if ( typeof this[setKeyMethod] === 'function') {
				this[key] = this[setKeyMethod](value);
			} else {
				this[key] = value;
			}
			this.trigger(_getMethodName(key) + 'Change', {
				value : value
			});
		}
	});
})(Simple);
